#include <iostream>
#include <string>
#include <limits>
using std::cout;
using std::endl;
using std::cin;
using std::string;
//标准输入输出流
//标准输入流：cin,从键盘中录入数据，读取到内存中
//标准输出流：cout,从内存中读取数据，显示到屏幕终端
//错误输出流：cerr
//
void check_stream_status(){
    cout << "goodbit:" << cin.good() << endl 
        << "failbit:" << cin.fail() << endl
        << "badbit:" << cin.bad() << endl
        << "eofbit:" << cin.eof() << endl;
}
void test(){
    int number;
    //如何区分输入还是输出符号呢？？？？？
    //>>观察箭头指向的是谁，那么就是流向谁
    //从cin流向number
    cin >> number;
    //从number流向cout
    cout << number << endl;
    check_stream_status();
}

void test2(){
    int number;
    cout << "第一次录入" << endl;
    cin >> number;
    cout << "录入的数字为:" << number <<endl;
    cout << "第二次录入,录入一个错误的数字" << endl;
    cin >> number;
    check_stream_status();
    //在流置于fail状态之后，做一个判断
    if(cin.fail()){
        //恢复流的状态位
        cin.clear();
        //ignore表示的是清空多长的缓冲区脏数据
        //如果在处理1024个字节的数据过程中，如果遇到了\n也结束
        //cin.ignore(1024, '\n');
        //但是1024毕竟是一个经验性的数值，为了编程的标准规范性
        //可以设置下面的一个极大的数值
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    check_stream_status();
    cout << "第三次录入一个字符串" << endl;
    string word;
    cin >> word;
    cout << "录入的字符串为:" << word << endl;
} 


void test3(){
    //录入整型数据，如果不是整型，则要求用户重新录入
    int number;
    while(1){
        cin >> number;
        if(cin.good()){
            cout << "number=" <<  number << endl;
            return;
        }else if(cin.fail()){
            cout << "当前录入的不是一个数字，请重新录入" << endl;
            cin.clear();//重置流的状态为good
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }else if(cin.bad() || cin.eof()){
            cout << "当前流出现问题,暂时无法使用" << endl;
        }
    }
}

void test4(){
    //cin >> 执行完这个操作之后，返回的结果依然是cin对象本身
    //cout << 执行完这个操作之后，返回的结果依然是cout对象本身
    int number, number2;
    cin >> number >> number2;
    (cin >> number) >> number2;
    cout << number << ":" << number2 << endl;
}

void test5(){
    int number;
    cin >> number;
    //判断当前cin的状态是否是good，如果是good，则输出一个数据
    if(cin.good()){
        cout << "number=" << number << endl;
    }
    //除了使用上述方式之外，还可以使用下面的这种简写
    //cin对象实现了某个运算符函数的重载
    //后续讲解到运算符重载章节给大家解密
    //cin放置于if条件判断中，会进行隐式类型转换为true/false
    //此时判断的条件是是否是fail状态
    //如果不是fail那么就是true，如果是fail就是false
    if(cin){
        cout << "number=" << number << endl;
    }
}

int main()
{
    test5();
    return 0;
}

